package com.asiainfo.indb.model;

import com.asiainfo.indb.PanelUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Enumeration;
import java.util.Properties;

/**
 * 从文件初始化数据，需要指定文件名
 * 由于最终该应用会打包成jar来运行，所以优先查找用户目录下的配置文件，再查找类路径下的
 *
 * @author zym
 * @date 2019-10-21 09:53
 */
public class FileGather extends InDbGather {

    public FileGather(String fileName) {
        init(fileName);
    }

    /**
     * 根据指定文件初始化此gather
     *
     * @param fileName 文件名
     */
    private void init(String fileName) {
        if (StringUtils.isNotBlank(fileName)) {
            // 先查找用户目录再找类路径
            String usrDir = System.getProperty("user.dir");

            // 确认是否存在
            Path filePath = Paths.get(usrDir + File.separator + fileName);
            if (!Files.exists(filePath)) {
                // 用户目录下不存在，查找类路径
                URL url = ClassLoader.getSystemResource(fileName);
                if (url != null) {
                    // 兼容win写法
                    filePath = new File(url.getFile()).toPath();
                }
            }

            if (Files.exists(filePath)) {
                Properties properties = new Properties();
                try (InputStream inputStream = Files.newInputStream(filePath, StandardOpenOption.READ)) {
                    properties.load(inputStream);

                    // 合并到gather内
                    String key;
                    Enumeration<Object> keys = properties.keys();
                    while (keys.hasMoreElements()) {
                        key = (String) keys.nextElement();
                        put(key, properties.getProperty(key));
                    }
                } catch (IOException e) {
                    PanelUtil.error(null, "加载配置文件" + fileName + "异常:" + e.getMessage());
                }
            }
        }
    }

    @Override
    public InDbGather gather() {
        return this;
    }


}